/*
  * 描          述:  <描述>
 * 修  改   人:  Administrator
 * 修改时间:  2018年5月25日
 * <修改描述:>
 */
package com.tx.core.method.request.impl;

import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;

import com.tx.core.exceptions.util.AssertUtils;
import com.tx.core.method.request.NativeInvokeRequest;

/**
 * Map类型的本地调用请求<br/>
 * <功能详细描述>
 * 
 * @author  Administrator
 * @version  [版本号, 2018年5月25日]
 * @see  [相关类/方法]
 * @since  [产品/模块版本]
 */
public class MapInvokeRequest implements NativeInvokeRequest {
    
    /** 参数注入请求 */
    private MultiValueMap<String, Object> multiValueMap;
    
    /** <默认构造函数> */
    public MapInvokeRequest(MultiValueMap<String, Object> params) {
        super();
        this.multiValueMap = params == null ? new LinkedMultiValueMap<>()
                : params;
    }
    
    /** <默认构造函数> */
    @SuppressWarnings("rawtypes")
    public MapInvokeRequest(Map<String, Object> params) {
        super();
        this.multiValueMap = new LinkedMultiValueMap<>();
        
        if (!MapUtils.isEmpty(params)) {
            for (Entry<String, Object> entryTemp : params.entrySet()) {
                if (entryTemp.getValue() instanceof Collection) {
                    for (Object obj : (Collection) entryTemp.getValue()) {
                        if (obj == null) {
                            continue;
                        }
                        this.multiValueMap.add(entryTemp.getKey(), obj);
                    }
                } else if (entryTemp.getValue().getClass().isArray()) {
                    for (Object obj : Arrays.asList(entryTemp.getValue())) {
                        if (obj == null) {
                            continue;
                        }
                        this.multiValueMap.add(entryTemp.getKey(), obj);
                    }
                } else {
                    this.multiValueMap.add(entryTemp.getKey(),
                            entryTemp.getValue());
                }
            }
        }
    }
    
    /**
     * @return
     */
    @Override
    public Iterator<String> getParameterNames() {
        return this.multiValueMap.keySet().iterator();
    }
    
    /**
     * @param paramName
     * @return
     */
    @Override
    public Object getParameter(String paramName) {
        AssertUtils.notEmpty(paramName, "paramName is empty.");
        
        return this.multiValueMap.getFirst(paramName);
    }
    
    /**
     * 根据参数名获取参数值集合<br/>
     * @param paramName
     * @return
     */
    @Override
    public Object[] getParameterValues(String paramName) {
        AssertUtils.notEmpty(paramName, "paramName is empty.");
        
        List<Object> resList = this.multiValueMap.get(paramName);
        if (CollectionUtils.isEmpty(resList)) {
            return null;
        }
        
        Object[] resObjects = resList.toArray(new Object[resList.size()]);
        return resObjects;
    }
    
    /**
     * @return
     */
    @Override
    public Map<String, Object[]> getParameterMap() {
        Map<String, Object[]> resMap = new HashMap<>();
        for (Entry<String, List<Object>> entryTemp : this.multiValueMap
                .entrySet()) {
            List<Object> objectList = entryTemp.getValue();
            resMap.put(entryTemp.getKey(),
                    objectList.toArray(new Object[objectList.size()]));
        }
        return resMap;
    }
}
